from alibabacloud_contactcenterai20240603.client import Client
from alibabacloud_tea_openapi.models import Config
from alibabacloud_contactcenterai20240603.models import RunCompletionMessageRequest, RunCompletionRequestDialogueSentences, RunCompletionRequestDialogue, RunCompletionRequestFields, RunCompletionRequest, AnalyzeConversationRequest, AnalyzeConversationRequestDialogueSentences, AnalyzeConversationRequestDialogue, AnalyzeConversationRequestFields, AnalyzeConversationRequestCategoryTags, AnalyzeConversationRequestServiceInspection, AnalyzeConversationRequestServiceInspectionInspectionContents

from flask import Flask, request, jsonify
import json

app = Flask(__name__)
# app.config["JSON_AS_ASCII"] = False  # 关键配置
app.json.ensure_ascii = False  # 高版本 Flask 的配置方式
    
workSpaceId = "llm-7sx5t6ojelkdemhz"
appId = "d838cbcadac2448a89c4d1bfcad7d943"

# 获取配置对象
def getConfig():
    config = Config()
    config.access_key_id = "LTAI4FgQwHTibt8od9Dtae7D"
    config.access_key_secret =  "OVYLakmKGhBvofVqin9HdbtcL1Lbaw"
    config.endpoint = "contactcenterai.cn-shanghai.aliyuncs.com"
    config.region_id = "cn-shanghai"
    config.read_timeout = 60000
    config.connect_timeout = 60000

    return config
# 获取Dialogue
def getDialogue():
    global request  # 关键修复：声明 request 为全局变量
    data = request.get_json()

    if not data or 'dialogue' not in data:
        return jsonify({'error': '缺少对话数据'}), 400

    sentenceList = []
    for item in data['dialogue']:
        role = item.get('role')
        content = item.get('content')
        if role and content:
            sentence = AnalyzeConversationRequestDialogueSentences(role, content)
            sentenceList.append(sentence)

    dialogue = AnalyzeConversationRequestDialogue(sentenceList, "session-adslsddxxxx")

    return dialogue

# 获取Dialogue
def getPrompt(key='title'):
    global request  # 关键修复：声明 request 为全局变量
    data = request.get_json()

    if not data or 'instruction' not in data:
        tasks = {
            'title': '请根据用户和客服之间的对话内容生成一个标题，不超过20个字，体现对话最核心的重点（不要太宽泛，也不要太具体）。注意不要出现多个关键词并列的结果，或者是完整的句子，需要是典型的标题格式。注意不要有“标题:”这样的前缀，不能出现书名号”《“”》“和顿号”、“，标题结尾也不要包含“。”或者“？”等标点符号',
            'summary': '请根据用户和客服之间的对话内容生成一段简短的摘要，要求文本流畅，事实准确，要点完整，包含信息数据，字数在50字以内。',
            'keywords': '请根据用户和客服之间的对话内容，从中抽取6个关键词，以顿号“、”分割，关键词不包含用户的姓名、手机号、性别等个人敏感信息，不包含“客服”、“用户”、“冒号”、“男”、“女”等词，如果没有合适的关键词，输出空字符串。',
            'questions_and_answer': '你现在是一名对话分析专家，从给定的客户和客服的对话中总结出客户最重要的几个问题和客服提供的对应的解决方案，以供其他客户参考，分析结果需要以json列表格式返回，其中的每个key为问题（Q）和其对应的解决方案（A）。',
            'question_solution': '## 任务指令\r\n请阅读客户与客服的工单和聊天记录，按照要求概括重要的信息。\r\n\r\n### 输入结构 (`input_schema`)\r\n1. **问题描述**：总结用户在对话中反馈或咨询的问题，尽可能简洁（50字以内）。2. **客服方案**：总结客服的处理方案，尽可能简洁（50字以内）。\r\n\r\n### 输出规则 (`output_rules`)\r\n - 输出内容要求：\r\n    - 如果用户或客服没有发言，或者无法提取到任何有效信息，对应的抽取结果为”“。\r\n    - 答案不能完全原文输出，需要高度的概括总结。\r\n    - 请确保输出的信息尽可能简洁，例如客服方案包括：告知时效、告知规则、安抚情绪、收集信息、跟进问题等。\r\n - 输出格式要求：以JSON格式返回，包含所有上述列出的信息，每行开始应注明关键字段名，后接冒号，然后是抽取\/总结到的信息。',
            'service_inspection': {
                "name": "销售场景",
                "desc": "请检测客服是否存在服务不当的行为，包括：客户咨询问题、客户遇到稳定性问题、小二反向嘲笑客户、小二质疑不满客户",
                "options": [
                    {
                        "name": "客户情绪是否负面",
                        "desc": "分析对话内容，输出用户在对话中表现出的情绪，详细要求：a. 当客户表现出负面情绪时，判定为消极；b. 当客户表现中积极情绪时，判定为积极；c. 如果客户文本没有明显的消极或积极情感色彩，则判定为中性。"
                    },
                    {
                        "name": "客户是否不满",
                        "desc": "对每一个对话从客户体验出发是否会获得用户的认可及满意，并给出理由，请按照如下步骤判断：a. 如果客服能够迅速、专业地解决问题，并以友好、积极的态度提供个性化的服务和支持，服务结束前用户诉求被解决或用户表示认可或满意，则最终结果判为满意；b. 如果客服未能迅速响应、解答不专业或态度冷漠，未能提供有效的解决方案或忽视客户的个性化需求，或服务结束前用户明确表达不接受或不满情绪，则最终结果判为不满意；c. 如果上面情况均不存在，服务结束前用户问题未解决但接受用户方案无明显不满情绪，如：那好吧，行吧等，则最终结果判为一般。"
                    },
                    {
                        "name": "小二反向嘲笑客户",
                        "desc": "小二在接待客户过程中反过来嘲笑客户，比如“你听不懂吗”“不明白吗”等。"
                    },
                    {
                        "name": "小二质疑不满客户",
                        "desc": "小二在接待客户过程中态度不耐烦并质疑客户，比如“你这什么态度”“你这么大声干什么”。"
                    },
                    {
                        "name": "小二是否辱骂",
                        "desc": "小二在接待客户过程中有没有出现辱骂的内容，，比如“操你妈”“傻逼”。"
                    }
                ]
            },
            'fields': [
                {
                    "name": "操作类型",
                    "desc": "客户咨询的问题类型"
                },
                {
                    "name": "账号余额",
                    "desc": "客户账户上的余额"
                },
                {
                    "name": "银行名称",
                    "desc": "客户卡号所属的银行名称"
                }
            ],
            'category_tag': [
                {
                    "name": "事件类型-业务查询",
                    "desc": "客服对已经存在的基本表及视图进行数据检索"
                },
                {
                    "name": "事件类型-服务投诉",
                    "desc": "客户发起投诉，投诉服务质量或者投诉某类服务支持人员"
                },
                {
                    "name": "事件类型-问题建议",
                    "desc": "客户对服务方式、产品质量、服务效率等提供相关建议"
                },
                {
                    "name": "事件类型-业务办理",
                    "desc": "客户具体进行某项业务办理，如提交申请、账号资金提取、税务申报等"
                }
            ],
        }
        return tasks[key]

    return data['instruction']
    
@app.route('/title', methods=['GET', 'POST'])
def title():
    """
    生成标题
    """
    config = getConfig()
    client = Client(config)

    dialogue = getDialogue()

    # 任务类型
    resultTypes = ["title"]

    # 自定义指令
    # prompt = "请根据用户和客服之间的对话内容生成一个标题，不超过20个字，体现对话最核心的重点（不要太宽泛，也不要太具体）。注意不要出现多个关键词并列的结果，或者是完整的句子，需要是典型的标题格式。注意不要有“标题:”这样的前缀，不能出现书名号”《“”》“和顿号”、“，标题结尾也不要包含“。”或者“？”等标点符号"
    prompt = getPrompt(resultTypes[0])

    request = AnalyzeConversationRequest()
    request.dialogue = dialogue
    request.result_types = resultTypes
    request.model_code = "tyxmPlus"
    request.stream = False
    request.custom_prompt = prompt

    response = client.analyze_conversation(workSpaceId, appId, request)
    body = response.body
    
    return jsonify({"text":body.text}), 200


@app.route('/summary', methods=['GET', 'POST'])
def summary():
    """
    总结摘要
    """
    config = getConfig()
    client = Client(config)

    dialogue = getDialogue()

    # 任务类型
    resultTypes = ["summary"]

    # 自定义指令
    # prompt = "请根据用户和客服之间的对话内容生成一段简短的摘要，要求文本流畅，事实准确，要点完整，包含信息数据，字数在50字以内。"
    prompt = getPrompt(resultTypes[0])

    request = AnalyzeConversationRequest()
    request.dialogue = dialogue
    request.result_types = resultTypes
    request.model_code = "tyxmPlus"
    request.stream = False
    request.custom_prompt = prompt

    response = client.analyze_conversation(workSpaceId, appId, request)
    body = response.body
    
    return jsonify({"text":body.text}), 200

@app.route('/keywords', methods=['GET', 'POST'])
def keywords():
    """
    关键词
    """
    config = getConfig()
    client = Client(config)

    dialogue = getDialogue()

    # 任务类型
    resultTypes = ["keywords"]

    # 自定义指令
    # prompt = "请根据用户和客服之间的对话内容，从中抽取6个关键词，以顿号“、”分割，关键词不包含用户的姓名、手机号、性别等个人敏感信息，不包含“客服”、“用户”、“冒号”、“男”、“女”等词，如果没有合适的关键词，输出空字符串。"
    prompt = getPrompt(resultTypes[0])

    request = AnalyzeConversationRequest()
    request.dialogue = dialogue
    request.result_types = resultTypes
    request.model_code = "tyxmPlus"
    request.stream = False
    request.custom_prompt = prompt

    response = client.analyze_conversation(workSpaceId, appId, request)
    body = response.body
    
    return jsonify({"text":body.text}), 200

@app.route('/questions_and_answer', methods=['GET', 'POST'])
def questions_and_answer():
    """
    Q&A
    """
    config = getConfig()
    client = Client(config)

    dialogue = getDialogue()

    # 任务类型
    resultTypes = ["questions_and_answer"]

    # 自定义指令
    # prompt = "你现在是一名对话分析专家，从给定的客户和客服的对话中总结出客户最重要的几个问题和客服提供的对应的解决方案，以供其他客户参考，分析结果需要以json列表格式返回，其中的每个key为问题（Q）和其对应的解决方案（A）。"
    prompt = getPrompt(resultTypes[0])

    request = AnalyzeConversationRequest()
    request.dialogue = dialogue
    request.result_types = resultTypes
    request.model_code = "tyxmPlus"
    request.stream = False
    request.custom_prompt = prompt

    response = client.analyze_conversation(workSpaceId, appId, request)
    body = response.body
    
    return body.text, 200

@app.route('/question_solution', methods=['GET', 'POST'])
def question_solution():
    """
    问题解决方案
    """
    config = getConfig()
    client = Client(config)

    dialogue = getDialogue()

    # 任务类型
    resultTypes = ["question_solution"]

    # 自定义指令
    # prompt = "\n## 任务指令\n请阅读客户与客服的工单和聊天记录，按照要求概括重要的信息。\n\n### 输入结构 (`input_schema`)\n1. **问题描述**：总结用户在对话中反馈或咨询的问题，尽可能简洁（50字以内）。2. **客服方案**：总结客服的处理方案，尽可能简洁（50字以内）。\n\n### 输出规则 (`output_rules`)\n - 输出内容要求：\n    - 如果用户或客服没有发言，或者无法提取到任何有效信息，对应的抽取结果为”“。\n    - 答案不能完全原文输出，需要高度的概括总结。\n    - 请确保输出的信息尽可能简洁，例如客服方案包括：告知时效、告知规则、安抚情绪、收集信息、跟进问题等。\n - 输出格式要求：以JSON格式返回，包含所有上述列出的信息，每行开始应注明关键字段名，后接冒号，然后是抽取/总结到的信息。"
    prompt = getPrompt(resultTypes[0])

    request = AnalyzeConversationRequest()
    request.dialogue = dialogue
    request.result_types = resultTypes
    request.model_code = "tyxmPlus"
    request.stream = False
    request.custom_prompt = prompt

    response = client.analyze_conversation(workSpaceId, appId, request)
    body = response.body
    
    result = []
    data = json.loads(body.text)
    for i,item in data.items():
        result.append({"name":i, "value":item})

    return jsonify(result), 200

@app.route('/service_inspection', methods=['GET', 'POST'])
def service_inspection():
    """
    服务质检
    """
    config = getConfig()
    client = Client(config)

    dialogue = getDialogue()

    # 任务类型
    resultTypes = ["service_inspection"]
    prompt = getPrompt(resultTypes[0])

    # # 质检项定义
    # contentList = []

    # content1 = AnalyzeConversationRequestServiceInspectionInspectionContents("分析对话内容，输出用户在对话中表现出的情绪，详细要求：a. 当客户表现出负面情绪时，判定为消极；b. 当客户表现中积极情绪时，判定为积极；c. 如果客户文本没有明显的消极或积极情感色彩，则判定为中性。","客户情绪是否正向")
    # contentList.append(content1)

    # content2 = AnalyzeConversationRequestServiceInspectionInspectionContents("对每一个对话从客户体验出发是否会获得用户的认可及满意，并给出理由，请按照如下步骤判断：a. 如果客服能够迅速、专业地解决问题，并以友好、积极的态度提供个性化的服务和支持，服务结束前用户诉求被解决或用户表示认可或满意，则最终结果判为满意；b. 如果客服未能迅速响应、解答不专业或态度冷漠，未能提供有效的解决方案或忽视客户的个性化需求，或服务结束前用户明确表达不接受或不满情绪，则最终结果判为不满意；c. 如果上面情况均不存在，服务结束前用户问题未解决但接受用户方案无明显不满情绪，如：那好吧，行吧等，则最终结果判为一般。","客户是否满意")
    # contentList.append(content2)

    # content3 = AnalyzeConversationRequestServiceInspectionInspectionContents("小二在接待客户过程中反过来嘲笑客户，比如“你听不懂吗”“不明白吗”等。","小二反向嘲笑客户")
    # contentList.append(content3)

    # content4 = AnalyzeConversationRequestServiceInspectionInspectionContents("小二在接待客户过程中态度不耐烦并质疑客户，比如“你这什么态度”“你这么大声干什么”。","小二质疑不满客户")
    # contentList.append(content4)

    # content5 = AnalyzeConversationRequestServiceInspectionInspectionContents("小二在接待客户过程中有没有出现辱骂的内容，，比如“操你妈”“傻逼”。","小二是否辱骂")
    # contentList.append(content5)
            

    # # 质检场景
    # serviceInspection = AnalyzeConversationRequestServiceInspection()
    # serviceInspection.scene_introduction = "销售场景"
    # serviceInspection.inspection_introduction = "请检测客服是否存在服务不当的行为，包括：客户咨询问题、客户遇到稳定性问题、小二反向嘲笑客户、小二质疑不满客户"
    # serviceInspection.inspection_contents = contentList

    # 质检项定义
    contentList = []

    for item in prompt['options']:
        content1 = AnalyzeConversationRequestServiceInspectionInspectionContents(item.get('desc'),item.get('name'))
        contentList.append(content1)

    # 质检场景
    serviceInspection = AnalyzeConversationRequestServiceInspection()
    serviceInspection.scene_introduction = prompt['name']
    serviceInspection.inspection_introduction = prompt['desc']
    serviceInspection.inspection_contents = contentList
        

    

    request = AnalyzeConversationRequest()
    request.dialogue = dialogue
    request.result_types = resultTypes
    request.model_code = "tyxmPlus"
    request.stream = False
    request.service_inspection = serviceInspection

    response = client.analyze_conversation(workSpaceId, appId, request)
    body = response.body
    
    return body.text, 200

@app.route('/fields', methods=['GET', 'POST'])
def fields():
    """
    关键信息
    """
    config = getConfig()
    client = Client(config)

    dialogue = getDialogue()

    # 任务类型
    resultTypes = ["fields"]

    prompt = getPrompt(resultTypes[0])

    # 信息抽取的字段
    fieldsList = []

    for item in prompt:
        fields1 = AnalyzeConversationRequestFields("",item.get('value'), None,item.get('name'))
        fieldsList.append(fields1)

    request = AnalyzeConversationRequest()
    request.dialogue = dialogue
    request.result_types = resultTypes
    request.model_code = "tyxmPlus"
    request.stream = False
    request.fields = fieldsList

    return jsonify([{'name':'','value':''}]), 200

    response = client.analyze_conversation(workSpaceId, appId, request)
    body = response.body

    result = []
    data = json.loads(body.text)
    for i,item in data.items():
        result.append({"name":i, "value":item})

    return jsonify(result), 200

@app.route('/category_tag', methods=['GET', 'POST'])
def category_tag():
    """
    标签分类
    """
    config = getConfig()
    client = Client(config)

    dialogue = getDialogue()

    # 任务类型
    resultTypes = ["category_tag"]

    prompt = getPrompt(resultTypes[0])

    categoryList = []
    # 标签分类定义
    for item in prompt:
        category1 = AnalyzeConversationRequestCategoryTags(item.get('name'), item.get('desc'))
        categoryList.append(category1)

    
    # categoryList = []
    # category1 = AnalyzeConversationRequestCategoryTags("事件类型-业务查询", "客服对已经存在的基本表及视图进行数据检索")
    # categoryList.append(category1)
    # category2 = AnalyzeConversationRequestCategoryTags("事件类型-服务投诉", "客户发起投诉，投诉服务质量或者投诉某类服务支持人员")
    # categoryList.append(category2)
    # category3 = AnalyzeConversationRequestCategoryTags("事件类型-问题建议", "客户对服务方式、产品质量、服务效率等提供相关建议")
    # categoryList.append(category3)
    # category4 = AnalyzeConversationRequestCategoryTags("事件类型-业务办理", "客户具体进行某项业务办理，如提交申请、账号资金提取、税务申报等")
    # categoryList.append(category4)

    

    request = AnalyzeConversationRequest()
    request.dialogue = dialogue
    request.result_types = resultTypes
    request.model_code = "tyxmPlus"
    request.stream = False
    request.category_tags = categoryList

    response = client.analyze_conversation(workSpaceId, appId, request)
    body = response.body
    
    return body.text, 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)  # 监听所有IP，端口80
    